home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / p4 / p4-1_2b.lha / p4-1.2b / monitors / addtwo.ask.c next >
C/C++ Source or Header  |  1993-02-05  |  2KB  |  103 lines

  1. #include "p4.h"
  2.  
  3. #define MAXLEN 500
  4. #define MAXPROCS 256
  5.  
  6. struct globmem {
  7.     int length;
  8.     int a[MAXLEN], b[MAXLEN], c[MAXLEN];
  9.     int num_added[MAXPROCS];
  10.     int sub;
  11.     int slave_id;
  12.     p4_lock_t go_lock;
  13.     p4_askfor_monitor_t askfor;
  14. } *glob;
  15.  
  16.  
  17. int getprob(v)            /* return next available subscript */
  18. P4VOID *v;
  19. {
  20. int rc = 1;   /* any non-zero means NO problem found */
  21. int *p;
  22.  
  23.     p = (int *) v;
  24.     if (glob->sub < glob->length)
  25.     {
  26.     *p = glob->sub++;
  27.     rc = 0;    /* FOUND a problem */
  28.     }
  29.     return(rc);
  30. }
  31.  
  32. P4VOID reset()
  33. {
  34. }
  35.  
  36. slave()
  37. {
  38.     work();
  39. }
  40.  
  41. main(argc,argv)
  42. int argc;
  43. char **argv;
  44. {
  45. int i, j, n, start, end;
  46.  
  47.     p4_initenv(&argc,argv);   /* args not used but passed for compat */
  48.  
  49.     glob = (struct globmem *) p4_shmalloc(sizeof(struct globmem));
  50.  
  51.     glob->sub = 0;
  52.     glob->slave_id = 0;
  53.     p4_lock_init(&(glob->go_lock));
  54.     p4_askfor_init(&(glob->askfor));
  55.  
  56.     /* read in the length and the two vectors */
  57.     scanf("%d",&glob->length);
  58.     for (i = 0; i < glob->length; i++)
  59.     scanf("%d",&glob->a[i]);
  60.     for (i = 0; i < glob->length; i++)
  61.     scanf("%d",&glob->b[i]);
  62.     
  63.     p4_create_procgroup();
  64.     if (p4_get_my_id() != 0)
  65.     {
  66.     slave();
  67.     exit(0);
  68.     }
  69.  
  70.     start = p4_clock();
  71.     work();
  72.     end   = p4_clock();
  73.  
  74.     for (i = 0; i < glob->length;) 
  75.     {
  76.     for (j = 0; (j < 9) && (i < glob->length); j++)
  77.         printf("%d\t", glob->c[i++]);
  78.     printf("\n");
  79.     }
  80.     for (i = 0, n = p4_num_total_ids(); i < n; i++)
  81.     printf("num by %d = %d \n",i,glob->num_added[i]);
  82.  
  83.     p4_wait_for_end();
  84. }
  85.  
  86. work()
  87. {
  88. int i, j, myid, nprocs, rc;
  89.  
  90.     /* lock/unlock acts like a barrier */
  91.     p4_lock(&(glob->go_lock));
  92.     p4_unlock(&(glob->go_lock));
  93.  
  94.     myid = p4_get_my_id();
  95.     glob->num_added[myid] = 0;
  96.     nprocs = p4_num_total_ids();
  97.     while (p4_askfor(&(glob->askfor),nprocs,getprob,(P4VOID *)&i,reset) == 0)
  98.     {
  99.     glob->c[i] = glob->a[i] + glob->b[i];
  100.     glob->num_added[myid]++;
  101.     }
  102. }
  103.